5. 클래스 추출하기
클래스의 일부 데이터+로직을 별개의 클래스로 추출
역할을 분리할 수 있음
- 데이터와 메서드를 따로 묶을 수 있는 경우
- 함께 변경되는 일이 많거나 서로 의존하는 데이터
- 제거해도 다른 필드나 메서드에 문제 없으면 분리 가능
절차
- 클래스의 역할을 분리할 방법을 정한다.
- 분리될 역할을 담당할 클래스를 새로 만든다.
- 원래 클래스에 남은 클래스 역할과 이름이 어울리지 않는다면 적절히 바꾼다.
- 원래 클래스의 생성자에서 새로운 클래스의 인스턴스를 생성하여 필드에 저장해둔다.
- 분리될 역할에 필요한 필드들을 새 클래스로 옮긴다(8.2). 하나씩 옮길 때마다 테스트한다.
- 메서드들도 새 클래스로 옮긴다(8.1). 이대 저수준 메서드, 즉 다른 메서드를 호출하지보다는 호출을 당하는 일이 많은 메서드부터 옮긴다. 하나씩 옮길 때마다 테스트한다.
- 양쪽 클래스의 인터페이스를 살펴보면서 불필요한 메서드를 제거하고, 이름도 새로운 환경에 맞게 바꾼다.
- 새 클래스를 외부로 노출할지 정한다. 노출하려거든 새 클래스에 참조를 값으로 바꾸기(9.4)를 적용할지 고민해본다.
예시 코드
😞 Before
class Person {
get officeAreaCode() {
return this._officeAreaCode
}
get officeNumber() {
return this._officeNumber
}
}
😃 After
class Person {
get officeAreaCode() {
return this._telephoneNumber.areaCode
}
get officeNumber() {
return this._telephoneNumber.number
}
}
class TelephoneNumber {
get areaCode() {
return this._areaCode
}
get number() {
return this._number
}
}